C=gcc
CC=g++
CFLAGS=-Wall -pedantic -pedantic-errors -g -ggdb -DDEBUG
LDFLAGS=
BINF=bin
HEADER_DIR=.

SHARED_SOURCES := $(shell find ./*/ -name '[^br|Br|identificador]*.cpp')
SHARED_OBJ=$(SHARED_SOURCES:.cpp=.o)

SHARED_SOURCES_C := $(shell find ./*/ -name '*clnt.c')
SHARED_OBJ_C=$(SHARED_SOURCES_C:.c=.o)

SHARED_SOURCES_SERVER_C := $(shell find ./identificador/ -name 'identificador_server.c')
SHARED_SOURCES_SERVER_C_OBJ := $(SHARED_SOURCES_SERVER_C:.c=.o)

SHARED_SOURCES_ID_SERVER := $(shell find './identificador/' -name '*.cpp')
SHARED_OBJ_ID_SERVER := $(SHARED_SOURCES_ID_SERVER:.cpp=.o)

INIT_SOURCES=iniciador.cpp
INIT_OBJ=$(INIT_SOURCES:.cpp=.o)
INIT_BIN=$(BINF)/iniciador

INIT_DISP_SOURCES=iniciadorDisp.cpp
INIT_DISP_OBJ=$(INIT_DISP_SOURCES:.cpp=.o)
INIT_DISP_BIN=$(BINF)/iniciadorDisp

INIT_EQ_ESP_SOURCES=iniciadorEquipoEspecial.cpp
INIT_EQ_ESP_OBJ=$(INIT_EQ_ESP_SOURCES:.cpp=.o)
INIT_EQ_ESP_BIN=$(BINF)/iniciadorEquipoEspecial

FIN_EQ_ESP_SOURCES=terminadorEquipoEspecial.cpp
FIN_EQ_ESP_OBJ=$(FIN_EQ_ESP_SOURCES:.cpp=.o)
FIN_EQ_ESP_BIN=$(BINF)/terminadorEquipoEspecial

FIN_DISP_SOURCES=terminadorDisp.cpp
FIN_DISP_OBJ=$(FIN_DISP_SOURCES:.cpp=.o)
FIN_DISP_BIN=$(BINF)/terminadorDisp

DISP_SOURCES=Dispositivo.cpp
DISP_OBJ=$(DISP_SOURCES:.cpp=.o)
DISP_BIN=$(BINF)/dispositivo

TESTERCOMUN_SOURCES=TesterComun.cpp
TESTERCOMUN_OBJ=$(TESTERCOMUN_SOURCES:.cpp=.o)
TESTERCOMUN_BIN=$(BINF)/testerComun

TESTERESP_SOURCES=TesterEspecial.cpp
TESTERESP_OBJ=$(TESTERESP_SOURCES:.cpp=.o)
TESTERESP_BIN=$(BINF)/testerEspecial

TECNICO_SOURCES=Tecnico.cpp
TECNICO_OBJ=$(TECNICO_SOURCES:.cpp=.o)
TECNICO_BIN=$(BINF)/tecnico

EQUIPOESP_SOURCES=EquipoEspecial.cpp
EQUIPOESP_OBJ=$(EQUIPOESP_SOURCES:.cpp=.o)
EQUIPOESP_BIN=$(BINF)/equipoEspecial

FIN_SOURCES=terminador.cpp
FIN_OBJ=$(FIN_SOURCES:.cpp=.o)
FIN_BIN=$(BINF)/terminador

INIT_ID_SERVER_SOURCES=./identificador/iniciador_identificador_server.cpp
INIT_ID_SERVER_OBJ=$(INIT_ID_SERVER_SOURCES:.cpp=.o)
INIT_ID_SERVER_BIN=$(BINF)/iniciadorIdServer

ID_SERVER_SOURCES=./identificador/identificador_svc.c
ID_SERVER_OBJ=$(ID_SERVER_SOURCES:.c=.o)
ID_SERVER_BIN=$(BINF)/idServer

FIN_ID_SERVER_SOURCES=./identificador/terminador_identificador_server.cpp
FIN_ID_SERVER_OBJ=$(FIN_ID_SERVER_SOURCES:.cpp=.o)
FIN_ID_SERVER_BIN=$(BINF)/terminadorIdServer

DISTR_MSG_TESTER_COMUN_SOURCES=DistribuidorMensajesTestersComunes.cpp
DISTR_MSG_TESTER_COMUN_OBJ=$(DISTR_MSG_TESTER_COMUN_SOURCES:.cpp=.o)
DISTR_MSG_TESTER_COMUN_BIN=$(BINF)/distribuidorMsgTester

all: testerComun testerEspecial tecnico dispositivo equipoEspecial iniciador iniciadorEquipoEspecial terminadorEquipoEspecial terminador iniciadorDisp terminadorDisp iniciadorIdServer idServer terminadorIdServer distribuidorMsgTester

iniciador: $(INIT_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(SHARED_OBJ) $(INIT_OBJ) $(SHARED_OBJ_C) -o $(INIT_BIN) -I$(HEADER_DIR)

dispositivo: $(DISP_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(SHARED_OBJ) $(DISP_OBJ) $(SHARED_OBJ_C) -o $(DISP_BIN) -I$(HEADER_DIR)
	
testerComun: $(TESTERCOMUN_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(TESTERCOMUN_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C) -o $(TESTERCOMUN_BIN) -I$(HEADER_DIR)
	
testerEspecial: $(TESTERESP_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(TESTERESP_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C) -o $(TESTERESP_BIN) -I$(HEADER_DIR)
	
equipoEspecial: $(EQUIPOESP_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(EQUIPOESP_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C) -o $(EQUIPOESP_BIN) -I$(HEADER_DIR)

tecnico: $(TECNICO_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(SHARED_OBJ) $(TECNICO_OBJ) $(SHARED_OBJ_C) -o $(TECNICO_BIN) -I$(HEADER_DIR)

terminador: $(FIN_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(SHARED_OBJ) $(FIN_OBJ) $(SHARED_OBJ_C) -o $(FIN_BIN) -I$(HEADER_DIR)

iniciadorIdServer: $(INIT_ID_SERVER_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(SHARED_OBJ) $(SHARED_OBJ_C) $(INIT_ID_SERVER_OBJ) -o $(INIT_ID_SERVER_BIN) -I$(HEADER_DIR)

idServer: $(ID_SERVER_OBJ) $(SHARED_SOURCES_SERVER_C_OBJ)
	$(CC) $(SHARED_SOURCES_SERVER_C_OBJ) $(ID_SERVER_OBJ) -o $(ID_SERVER_BIN) -I$(HEADER_DIR)

terminadorIdServer: $(FIN_ID_SERVER_OBJ) $(SHARED_OBJ) $(SHARED_OBJ_C)
	$(CC) $(SHARED_OBJ) $(SHARED_OBJ_C) $(FIN_ID_SERVER_OBJ) -o $(FIN_ID_SERVER_BIN) -I$(HEADER_DIR)

iniciadorDisp: $(INIT_DISP_OBJ) $(SHARED_OBJ)
	$(CC) $(SHARED_OBJ) $(INIT_DISP_OBJ) -o $(INIT_DISP_BIN) -I$(HEADER_DIR)

terminadorDisp: $(FIN_DISP_OBJ) $(SHARED_OBJ)
	$(CC) $(SHARED_OBJ) $(FIN_DISP_OBJ) -o $(FIN_DISP_BIN) -I$(HEADER_DIR)

iniciadorEquipoEspecial: $(INIT_EQ_ESP_OBJ) $(SHARED_OBJ)
	$(CC) $(SHARED_OBJ) $(INIT_EQ_ESP_OBJ) -o $(INIT_EQ_ESP_BIN) -I$(HEADER_DIR)

terminadorEquipoEspecial: $(FIN_EQ_ESP_OBJ) $(SHARED_OBJ)
	$(CC) $(SHARED_OBJ) $(FIN_EQ_ESP_OBJ) -o $(FIN_EQ_ESP_BIN) -I$(HEADER_DIR)

distribuidorMsgTester: $(DISTR_MSG_TESTER_COMUN_OBJ) $(SHARED_OBJ)
	$(CC) $(SHARED_OBJ) $(DISTR_MSG_TESTER_COMUN_OBJ) -o $(DISTR_MSG_TESTER_COMUN_BIN) -I$(HEADER_DIR)

.cpp.o:
	$(CC) $(CFLAGS) -I$(HEADER_DIR) -c $< -o $@
	
.c.o:
	$(CC) $(CFLAGS) -I$(HEADER_DIR) -c $< -o $@

clean:
	$(RM) $(INIT_OBJ) $(INIT_BIN) $(DISP_OBJ) $(DISP_BIN) $(TESTERCOMUN_OBJ) $(TESTERCOMUN_BIN) $(TESTERESP_OBJ) $(TESTERESP_BIN) $(EQUIPOESP_OBJ) $(EQUIPOESP_BIN) $(TECNICO_OBJ) $(TECNICO_BIN) $(FIN_BIN) $(FIN_OBJ) $(INIT_ID_SERVER_BIN) $(INIT_ID_SERVER_OBJ) $(ID_SERVER_BIN) $(ID_SERVER_OBJ) $(FIN_ID_SERVER_BIN) $(FIN_ID_SERVER_OBJ) $(INIT_DISP_OBJ) $(INIT_DISP_BIN) $(FIN_DISP_OBJ) $(FIN_DISP_BIN) $(SHARED_OBJ) $(SHARED_OBJ_C) $(SHARED_SOURCES_SERVER_C_OBJ) $(DISTR_MSG_TESTER_COMUN_OBJ) $(DISTR_MSG_TESTER_COMUN_BIN) $(INIT_EQ_ESP_OBJ) $(INIT_EQ_ESP_BIN) $(FIN_EQ_ESP_OBJ) $(FIN_EQ_ESP_BIN)
